<?php

declare(strict_types=1);
/**
 * This file is part of Hyperf.
 *
 * @link     https://www.hyperf.io
 * @document https://hyperf.wiki
 * @contact  group@hyperf.io
 * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
 */
namespace App\Service;

use App\Constants\ErrorCode;
use App\Exception\BusinessException;
use App\Model\User;
use App\Request\UserLoginRequest;
use App\Service\Dao\UserDao;
use Hyperf\Di\Annotation\Inject;
use HyperfX\Utils\Service;

class UserService extends Service
{
    /**
     * @Inject
     * @var UserDao
     */
    protected $dao;

    public function login(string $mobile, int $type, string $code)
    {
        $user = $this->dao->firstByMobile($mobile);
        if (empty($user)) {
            throw new BusinessException(ErrorCode::USER_NOT_EXISTS);
        }

        if ($type === UserLoginRequest::TYPE_CODE) {
            if (! di()->get(SmsService::class)->checkCode($mobile, $code)) {
                throw new BusinessException(ErrorCode::SMS_INVALID);
            }
        } else {
            if (! $user->verify($code)) {
                throw new BusinessException(ErrorCode::USER_PASSWORD_INVALID);
            }
        }

        return $user;
    }

    public function register(string $mobile, int $type, string $code)
    {
        if (! di()->get(SmsService::class)->checkCode($mobile, $code)) {
            throw new BusinessException(ErrorCode::SMS_INVALID);
        }

        $user = $this->dao->firstByMobile($mobile);
        if (empty($user)) {
            $user = $this->dao->create($mobile, $type);
        }

        return $user;
    }

    /**
     * @param $input = [
     *     'nickname' => '',
     *     'gender' => 0,
     *     'avatar' => '',
     *     'birthday' => '',
     *     'education' => '',
     *     'intro' => '',
     * ]
     */
    public function save(int $userId, array $input): User
    {
        $user = $this->dao->first($userId, true);
        $user->nickname = $input['nickname'];
        $user->gender = $input['gender'];
        if (isset($input['avatar'])) {
            $user->avatar = $input['avatar'];
        }
        if (isset($input['birthday'])) {
            $user->birthday = $input['birthday'];
        }
        if (isset($input['education'])) {
            $user->education = $input['education'];
        }
        if (isset($input['intro'])) {
            $user->intro = $input['intro'];
        }

        $user->save();

        return $user;
    }

    public function password($userId, $password)
    {
        $user = $this->dao->first($userId, true);
        $user->password = $user->hash($password);
        return $user->save();
    }
}
